package com.reactim.message.config.management;

import lombok.Data;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

/**
 * 配置差异比较结果
 * 
 * <p>封装两个配置版本之间的差异信息，提供详细的差异分析和比较结果。</p>
 * 
 * @author ReactIM Team
 * @version 1.0.0
 * @since 1.0.0
 */
@Data
public class ConfigurationDiff {
    
    /**
     * 第一个配置名称
     */
    private String config1Name;
    
    /**
     * 第二个配置名称
     */
    private String config2Name;
    
    /**
     * 比较时间戳
     */
    private LocalDateTime compareTimestamp;
    
    /**
     * 差异列表
     */
    private List<ConfigurationDifference> differences;
    
    /**
     * 构造函数
     * 
     * @param config1Name 第一个配置名称
     * @param config2Name 第二个配置名称
     */
    public ConfigurationDiff(String config1Name, String config2Name) {
        this.config1Name = config1Name;
        this.config2Name = config2Name;
        this.compareTimestamp = LocalDateTime.now();
        this.differences = new ArrayList<>();
    }
    
    /**
     * 添加差异
     * 
     * @param path 配置路径
     * @param description 差异描述
     */
    public void addDifference(String path, String description) {
        differences.add(new ConfigurationDifference(path, description, null, null));
    }
    
    /**
     * 添加差异（包含值）
     * 
     * @param path 配置路径
     * @param description 差异描述
     * @param value1 第一个配置的值
     * @param value2 第二个配置的值
     */
    public void addDifference(String path, String description, Object value1, Object value2) {
        differences.add(new ConfigurationDifference(path, description, value1, value2));
    }
    
    /**
     * 检查是否有差异
     * 
     * @return 如果有差异返回true
     */
    public boolean hasDifferences() {
        return !differences.isEmpty();
    }
    
    /**
     * 获取差异数量
     * 
     * @return 差异数量
     */
    public int getDifferenceCount() {
        return differences.size();
    }
    
    /**
     * 配置差异详情
     */
    @Data
    public static class ConfigurationDifference {
        
        /**
         * 配置路径
         */
        private String path;
        
        /**
         * 差异描述
         */
        private String description;
        
        /**
         * 第一个配置的值
         */
        private Object value1;
        
        /**
         * 第二个配置的值
         */
        private Object value2;
        
        /**
         * 构造函数
         * 
         * @param path 配置路径
         * @param description 差异描述
         * @param value1 第一个配置的值
         * @param value2 第二个配置的值
         */
        public ConfigurationDifference(String path, String description, Object value1, Object value2) {
            this.path = path;
            this.description = description;
            this.value1 = value1;
            this.value2 = value2;
        }
        
        /**
         * 检查是否有值信息
         * 
         * @return 如果有值信息返回true
         */
        public boolean hasValues() {
            return value1 != null || value2 != null;
        }
    }
}